/*
 * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 */

package java.nio;

// ## If the sequence is a string, use reflection to share its array

class StringCharBuffer                                  // package-private
    extends CharBuffer {

  CharSequence str;

  StringCharBuffer(CharSequence s, int start, int end) { // package-private
    super(-1, start, end, s.length());
    int n = s.length();
    if ((start < 0) || (start > n) || (end < start) || (end > n)) {
      throw new IndexOutOfBoundsException();
    }
    str = s;
  }

  public CharBuffer slice() {
    return new StringCharBuffer(str,
        -1,
        0,
        this.remaining(),
        this.remaining(),
        offset + this.position());
  }

  private StringCharBuffer(CharSequence s,
      int mark,
      int pos,
      int limit,
      int cap,
      int offset) {
    super(mark, pos, limit, cap, null, offset);
    str = s;
  }

  public CharBuffer duplicate() {
    return new StringCharBuffer(str, markValue(),
        position(), limit(), capacity(), offset);
  }

  public CharBuffer asReadOnlyBuffer() {
    return duplicate();
  }

  public final char get() {
    return str.charAt(nextGetIndex() + offset);
  }

  public final char get(int index) {
    return str.charAt(checkIndex(index) + offset);
  }

  char getUnchecked(int index) {
    return str.charAt(index + offset);
  }

  // ## Override bulk get methods for better performance

  public final CharBuffer put(char c) {
    throw new ReadOnlyBufferException();
  }

  public final CharBuffer put(int index, char c) {
    throw new ReadOnlyBufferException();
  }

  public final CharBuffer compact() {
    throw new ReadOnlyBufferException();
  }

  public final boolean isReadOnly() {
    return true;
  }

  final String toString(int start, int end) {
    return str.toString().substring(start + offset, end + offset);
  }

  public final CharBuffer subSequence(int start, int end) {
    try {
      int pos = position();
      return new StringCharBuffer(str,
          -1,
          pos + checkIndex(start, pos),
          pos + checkIndex(end, pos),
          capacity(),
          offset);
    } catch (IllegalArgumentException x) {
      throw new IndexOutOfBoundsException();
    }
  }

  public boolean isDirect() {
    return false;
  }

  public ByteOrder order() {
    return ByteOrder.nativeOrder();
  }

}
